www.gusucode.com > VC++ 聊天室系统+开发文档 > VC++ 聊天室系统+开发文档/code/ChatRoomSever/UserList.cpp
// UserList.cpp : implementation file // #include "stdafx.h" #include "ChatRoomServer.h" #include "UserList.h" #include "ChatServer.h" extern ChatServer* g_pchatserver; extern ULNode* g_puserlist; extern HANDLE g_hClientInfoMutex; extern CString g_smsg; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CUserList dialog //static member initialize int CUserList::objcount = 0; CUserList::CUserList(CWnd* pParent /*=NULL*/) : CDialog(CUserList::IDD, pParent) { //{{AFX_DATA_INIT(CUserList) //}}AFX_DATA_INIT objcount++; } BOOL CUserList::HasObject() { if(objcount<1) return FALSE; else return TRUE; } void CUserList::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CUserList) DDX_Control(pDX, IDC_USERLIST, m_ListCtrl); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CUserList, CDialog) //{{AFX_MSG_MAP(CUserList) ON_MESSAGE(WM_USERIN,OnUserIn) ON_MESSAGE(WM_USERQUIT,OnUserQuit) ON_BN_CLICKED(IDC_BUTTON_ADDTODISABLELIST, OnButtonAddtodisablelist) ON_BN_CLICKED(IDC_BUTTON_LETOUT, OnButtonLetout) ON_WM_CLOSE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CUserList message handlers BOOL CUserList::OnInitDialog() { CDialog::OnInitDialog(); LV_COLUMN lvcol; ListView_SetExtendedListViewStyle(m_ListCtrl.GetSafeHwnd(), LVS_EX_GRIDLINES); //Show gridlines lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH; lvcol.fmt=LVCFMT_LEFT; int i=0; lvcol.pszText="用户名"; lvcol.iSubItem=i; lvcol.cx=70; m_ListCtrl.InsertColumn(i++,&lvcol); lvcol.pszText="IP地址"; lvcol.iSubItem=i; lvcol.cx=70; m_ListCtrl.InsertColumn(i++,&lvcol); lvcol.pszText="登陆时间"; lvcol.iSubItem=i; lvcol.cx=70; m_ListCtrl.InsertColumn(i++,&lvcol); ListUser(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CUserList::OnButtonAddtodisablelist() {//add these users'ip to config.ini and delete these item from list. //if these users are on line then disconnect // int i,iState; // int nItemSelected=m_ListCtrl.GetSelectedCount(); //selected item count // int nItemCount=m_ListCtrl.GetItemCount(); //get list item count // if(nItemSelected<1) return; // for(i=nItemCount-1;i>=0;i--) // { // iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED); // if(iState!=0) m_ListCtrl.DeleteItem(i); // } } LRESULT CUserList::OnUserIn(WPARAM wParam, LPARAM lParam) { m_ListCtrl.DeleteAllItems(); ListUser(); return 0; } LRESULT CUserList::OnUserQuit(WPARAM wParam, LPARAM lParam) { m_ListCtrl.DeleteAllItems(); ListUser(); return 0; } void CUserList::OnButtonLetout() {//disconnect these users'connection,and delete these item from list. int i,iState; char name[MAX_NAME_SIZE]; int nItemSelected=m_ListCtrl.GetSelectedCount(); //selected item count int nItemCount=m_ListCtrl.GetItemCount(); //get list item count if(nItemSelected<1) return; for(i=nItemCount-1;i>=0;i--) { iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED); if(iState!=0) { m_ListCtrl.GetItemText(i,0,name,MAX_NAME_SIZE); g_pchatserver->LetUserOut(name); } } } void CUserList::OnClose() { objcount--; g_pchatserver->SetUserListDlgHandle(NULL); CDialog::OnClose(); } void CUserList::ListUser() { LV_ITEM lvitem; ULNode *ptr = g_puserlist; int i=0,iPos; WaitForSingleObject(g_hClientInfoMutex,INFINITE); while(ptr) { lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM; lvitem.iItem=i; lvitem.iSubItem=0; lvitem.pszText=ptr->szUsername; lvitem.lParam=i; iPos=m_ListCtrl.InsertItem(&lvitem);//return the index id of inserted item lvitem.mask=LVIF_TEXT; lvitem.iItem=iPos; lvitem.iSubItem=1; lvitem.pszText=ptr->szIP; m_ListCtrl.SetItem(&lvitem); lvitem.iSubItem=2; lvitem.pszText=ptr->sztime; m_ListCtrl.SetItem(&lvitem); ptr = ptr->next; i++; } ReleaseMutex(g_hClientInfoMutex); }